package cn.tansanqinger.linked;
interface IQueue<T>{
    void push(T data);//压入数据
    boolean empty();//如果队列为空返回true，否则返回false
    int size();//返回队列中元素的个数
    void pop();//删除队列首元素但不返回其值
    T front();//返回队首元素的值，但不删除该元素
    T back();//返回队列尾元素的值，但不删除该元素
}
class QueueImpl<T> implements IQueue<T>{
    private Node hand;//队首
    private Node next;//队尾
    private int size;//队列长度

    @Override
    public void push(T data) {
        Node node = new Node(data);
        if(this.hand==null){
            this.hand = node;
            this.next = node;
        } else {
            this.next.last = node;
            this.next = this.next.last;
        }
        this.size ++ ;
    }

    @Override
    public boolean empty() {
        return this.hand!=null;
        //return this.size!=0;//两种方法都可以
    }

    @Override
    public int size() {
        return this.size;
    }

    @Override
    public void pop() {
        this.size -- ;
        this.hand = this.hand.last;//指针移动
    }

    @Override
    public T front() {
        return (T) this.hand.data;//返回数据
    }

    @Override
    public T back() {
        return (T) this.next.data;//返回队尾数据
    }

    private class Node<T>{//链表结点
        private T data;
        private Node last;//保存下一个结点
        private  Node(T data){
            this.data = data;
        }
    }
}
public class SimulateQueueDemo {
    public static void main(String[] args) {
        IQueue<String> queue = new QueueImpl<>();
        queue.push("A");
        queue.push("B");
        queue.push("C");
        System.out.println("队首数据为："+queue.front());
        System.out.println("队尾数据为："+queue.back());
        while(queue.empty()){
            System.out.print("弹出数据为："+queue.front());
            queue.pop();
            System.out.println("，队列中数据剩余："+queue.size());
        }
    }
}
